' QB64PE Triangle Fill Demo by b+
' as found at https://qb64phoenix.com/forum/showthread.php?tid=1897&pid=18586#pid18586
' This BASIC Anywhere Machine port by Charlie Veniot
' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2023.08.08.01.01]) on 2023.08.13 at 01:36 (Coordinated Universal Time)
_Title "Filled Triangle Demo" 'b+ 2023-08-12
Screen _NewImage(800, 600, 12) ' use 16 colors for demo
declare Sub ftri (xx1, yy1, xx2, yy2, xx3, yy3, c)
' _ScreenMove 250, 60
Print "Here is one, press any for many...."
ftri (100, 100, 500, 10, 300, 480, 9)
Sleep
Do
ftri (Rnd * _Width, Rnd * _Height, Rnd * _Width, Rnd * _Height, Rnd * _Width, Rnd * _Height, int(Rnd * 15)+1)
_delay 0.25
Loop
Sub ftri (xx1, yy1, xx2, yy2, xx3, yy3, c)
'make copies before swapping because QB64 passes by ref and these get changed
x1 = xx1: y1 = yy1: x2 = xx2: y2 = yy2: x3 = xx3: y3 = yy3
'thanks Andy Amaya!
'triangle coordinates must be ordered: where x1 < x2 < x3
If x2 < x1 Then Swap x1, x2: Swap y1, y2
If x3 < x1 Then Swap x1, x3: Swap y1, y3
If x3 < x2 Then Swap x2, x3: Swap y2, y3
If x1 <> x3 Then slope1 = (y3 - y1) / (x3 - x1)
'draw the first half of the triangle
length = x2 - x1
If length <> 0 Then
slope2 = (y2 - y1) / (x2 - x1)
For x = 0 To length
Line (Int(x + x1), Int(x * slope1 + y1))-(Int(x + x1), Int(x * slope2 + y1)), c
'lastx2% = lastx%
lastx% = Int(x + x1)
Next
End If
'draw the second half of the triangle
y = length * slope1 + y1: length = x3 - x2
If length <> 0 Then
slope3 = (y3 - y2) / (x3 - x2)
For x = 0 To length
'IF INT(x + x2) <> lastx% AND INT(x + x2) <> lastx2% THEN 'works! but need 2nd? check
If Int(x + x2) <> lastx% Then
Line (Int(x + x2), Int(x * slope1 + y))-(Int(x + x2), Int(x * slope3 + y2)), c
End If
Next
End If
End Sub